<?php
//include_once('DB.class.php');
class News{
	protected $BD, $Uzytkownik, $Serwis, $Kategoria; // baza danych
	
	function __construct($BD){
		//require_once('bazadanych.class.php');
		$this->BD = $BD; //new cBazaDanych();
		require_once('serwis.class.php');
		$this->Serwis = new cSerwis($BD);
		require_once('uzytkownik.class.php');
		$this->Uzytkownik = new cUzytkownik($BD);
		require_once('kategoria.class.php');
		$this->Kategoria = new cKategoria($BD);
	}
	
	private function Istnieje($id){
		$sql = "SELECT count(*) FROM `newsy` WHERE `id_news` = $id;";
		$wynik = $this->BD->ZapytanieOLiczbe($sql);
		if ($wynik == 0) return false;
		else return true;
	}
	
	public function Pokaz($dane){
		// dane => id, kategoria, serwis, liczba, strona
		//print_r($dane);
		$wynik;
		if (isset($dane['id_news'])){
			$sql = "SELECT * FROM `newsy` n INNER JOIN `newsy_kategorie` k ON n.id_news = k.id_news WHERE n.id_news = {$dane['id_news']};";	
		}
		else{
			if (isset($dane['id_kategoria'], $dane['id_serwis'])) $sql = "SELECT * FROM `newsy` n INNER JOIN `newsy_kategorie` k ON n.id_news = k.id_news WHERE n.id_serwis = {$dane['id_serwis']} AND k.id_kategoria = {$dane['id_kategoria']} ";
			else if (isset($dane['id_kategoria'])) $sql = "SELECT * FROM `newsy` n INNER JOIN `newsy_kategorie` k ON n.id_news = k.id_news WHERE k.id_kategoria = {$dane['id_kategoria']} ";
			else if (isset($dane['id_serwis'])) $sql = "SELECT * FROM `newsy` n INNER JOIN `newsy_kategorie` k ON n.id_news = k.id_news WHERE n.id_serwis = {$dane['id_serwis']} ";
			else $sql = "SELECT * FROM `newsy` n INNER JOIN `newsy_kategorie` nk ON n.id_news = nk.id_news ";
			$sql .= "ORDER BY `data` DESC ";
			$sql_bez_stron =$sql.';';
			if (isset($dane['liczba'])){
				if (isset($dane['strona'])) $dane['strona']--;
				else $dane['strona'] = 0;
				$sql .= "LIMIT ".($dane['strona']*$dane['liczba']).",{$dane['liczba']} ";
			}
			$sql .= ';';
			//echo $sql;
		}
		try{
			if (!isset($dane['id_news'])){
				$sql_bez_stron = str_replace("*", "count(*)",$sql_bez_stron);
				$liczba_wszystkich =$this->BD->ZapytanieOLiczbe($sql_bez_stron);
			}
			else $liczba_wszystkich = 1;
			
			$wynik = $this->BD->Zapytanie($sql, true, false);
			//var_dump($wynik);
			if (empty($wynik)) {
				return array();
			}
			foreach ($wynik as $nr => $dane){
				if ($wynik[$nr]['tytul'] != ''){
					$wynik[$nr]['tytul'] = stripslashes($dane['tytul']);
					$wynik[$nr]['wstep'] = stripslashes($dane['wstep']);
					if (!empty($wynik[$nr]['obrazek'])) $wynik[$nr]['obrazek'] = str_replace("&", "&amp;", $wynik[$nr]['obrazek']);
					$wynik[$nr]['tresc'] = stripslashes($dane['tresc']);
				}			
			}
			$wynik['liczba_wszystkich'] = $liczba_wszystkich;
			if ($wynik == false) throw new Exception('Nie mozna wyswietlic okreslonych newsow.');
		} catch(Exception $e){
			echo $e->getMessage();
		}
		//var_dump($wynik);
		return $wynik;
		
	}
	public function MaxId(){
		return $this->BD->Max('newsy', 'id_news');
	}
	
	public function Dodaj($dane){
		// dane => tytul, wstep, tresc, url, data, obrazek, uzytkownik, serwis, kategorie = array (1, 2, 6) ...
		// dodawanie do newsy, uaktualnianie serwisy i uzytkownicy
		$dane['id_news'] = $this->MaxId() + 1;
		$dane['id_uzytkownik'] = $_SESSION['id_uzytkownik'];
		$wynik = true;
		//$sql = "INSERT INTO `newsy` (`id_news`, `tytul`, `wstep`, `tresc`, `url`, `data`, `klikniec`, `ocena`, `obrazek`, `id_uzytkownik`, `id_serwis`) \n
		//VALUES ({$dane['id_news']}, '{$dane['tytul']}', '{$dane['wstep']}', '{$dane['tresc']}', '{$dane['url']}', '{$dane['data']}', NULL, NULL, '{$dane['obrazek']}', {$dane['id_uzytkownik']}, {$dane['id_serwis']});";
		$kategorie = $dane['id_kategoria'];
		unset($dane['id_kategoria']);
		$dane['data'] = empty($dane['data']) ? date("Y-m-d H:i:s") : $dane['data'];
		//$zastap_to = array('&#8211;', '�');
		//$zastap_tym = array('-', '-');
		//$dane['tytul'] = str_replace($zastap_to, $zastap_tym, $dane['tytul']);
		//$dane['tytul'] = htmlspecialchars($dane['tytul']);
		//$dane['wstep'] = str_replace($zastap_to, $zastap_tym, $dane['wstep']);
		//$dane['wstep'] = htmlspecialchars($dane['wstep']);
		//$dane['tresc'] = str_replace($zastap_to, $zastap_tym, $dane['tresc']);
		//$dane['tresc'] = htmlspecialchars($dane['tresc']);
		$wynik = $this->BD->Insert('newsy', $dane, true);
		if($wynik != false){
			//echo 'dodalem do newsy, ';
			$wynik = $this->Serwis->ZwiekszNewsy($dane['id_serwis']);
		}
		if($wynik != false){
			//echo 'zwiekszylem newsy serwisowi, ';
			$wynik = $this->Uzytkownik->ZwiekszNewsy($_SESSION['id_uzytkownik']);
		}
		if ($wynik != false){
			//echo 'zwiekszylem newsy uzytkownikowi, ';
		// dodawanie do newsy_kategorie
			if ($this->DodajDoKategorii($dane['id_news'], $kategorie)){ 
				//echo 'dodalem do kategorii';
				return true;
			}
			else{ 
				echo 'Pojawil sie blad podczas dodawania do kategorii. ';
				return false;
			}
		}
		else{
			echo 'Nie mozna dodac newsa przy pomocy tego zapytania. ';
		}
		
	}
	
	public function Usun($id){
		if ($this->Istnieje($id)){
			$dane_tmp['id_news'] = $id;
			$dane = $this->Pokaz($dane_tmp);
			$dane = $dane[0];
			$this->Serwis->ZmniejszNewsy($dane['id_serwis']);
			$this->UsunZKategorii($id, $this->Kategorie($id));
			$this->Uzytkownik->ZmniejszNewsy($dane['id_uzytkownik']);
			$sql = "DELETE FROM `newsy` WHERE `id_news` = $id;";
			return $this->BD->Zapytanie($sql, false, true);
		}
		else return false;
	}
	
	public function Uaktualnij($dane){
		$id_news = $dane['id_news'];
		$obecne_kategorie = $this->Kategorie($dane['id_news']);
		print_r($obecne_kategorie);
		//$obecne_kategorie = $obecne_kategorie['id_kategoria'];
		$obecny_serwis = $this->Dane($id_news);
		$obecny_serwis = $obecny_serwis[0]['id_serwis'];
		$this->UsunZKategorii($id_news, $obecne_kategorie);
		$this->DodajDoKategorii($id_news, $dane['id_kategoria']);
		if ($obecny_serwis != $dane['id_serwis']){ 
			$this->Serwis->ZmniejszNewsy($obecny_serwis);
			$this->Serwis->ZwiekszNewsy($dane['id_serwis']);
		}
		unset($dane['id_kategoria']);
		return $this->BD->Update('newsy', $dane, 'id_news', true);
	}
	
	public function Kategorie($id){ 
		// zwraca tablice z numerami kategorii, do ktorych nalezy news o danym id
		$sql = "SELECT `k`.`id_kategoria` AS id_kategoria, `k`.`nazwa` AS nazwa FROM `newsy_kategorie` nk, `kategorie` k WHERE `nk`.`id_news` = $id AND `k`.`id_kategoria` = `nk`.`id_kategoria`;";
		$wynik = $this->BD->Zapytanie($sql, true, true);
		if ($wynik == false) return false;
		foreach ($wynik as $nr => $dane){
			$kat[$dane['nazwa']] = $dane['id_kategoria'];
		}
		return $kat;
	}
	
	public function Dane($id, $limit = 0){
		$sql = ($id == false) ? "SELECT * FROM `newsy` ORDER BY `data` DESC" : "SELECT * FROM `newsy` WHERE `id_news` = $id;";
		if ($limit != 0 && $id == false) $sql .= " LIMIT $limit;";
		else $sql .= ';';
		$wynik = $this->BD->Zapytanie($sql, true, true);
		if ($id == false) return $wynik;
		else return $wynik[0];
	}
	
	private function DodajDoKategorii($id_news, $kategorie){
		// $kategorie = array (0 => '1', 1 => '4' ....)
		foreach ($kategorie as $nr){
			$sql = "INSERT INTO `newsy_kategorie` (`id_news`, `id_kategoria`) VALUES ($id_news, $nr);";
			$this->BD->Zapytanie($sql, false, true);
			$this->Kategoria->ZwiekszNewsy($nr);
		}
		return true;
	}
	
	private function UsunZKategorii($id_news, $kategorie){
		$ok = true;
		$zPowodu = '';
		foreach ($kategorie as $id_kategoria){
				$sql = "DELETE FROM `newsy_kategorie` WHERE `id_news` = $id_news AND `id_kategoria` = $id_kategoria;";
				$wynik = $this->BD->Zapytanie($sql, false, false);
				if ($wynik == false){ 
					$ok = false;
					$zPowodu = $sql;
				}
				else $this->Kategoria->ZmniejszNewsy($id_kategoria);
		}
		return $ok;		
	}
	
	public function Klikniecie($id_news){
		$dane = $this->Dane($id_news);
		//print_r($dane);
		$this->Serwis->Klikniecie($dane['id_serwis']);
		$kat = $this->Kategorie($id_news);
		foreach ($kat as $nazwa => $id_kategoria){
			$this->Kategoria->Klikniecie($id_kategoria);
		}
		$sql = "UPDATE `newsy` SET `klikniec` = `klikniec` + 1 WHERE `id_news` = $id_news;";
		return $this->BD->Zapytanie($sql, false, true);
	}
	
	public function Statystyki($sekcja = 'brak', $czas = 'ten_miesiac', $dziedzina = 'klikniecia', $top = 10){
		// sekcja = {newsy, serwisy, kategorie}, 
		//$poczatekMiesiaca = date('Y-m-01');
		//$dniTemu = date('Y-m-d', time() - ($dni * 24 * 60 * 60));
		$dzisiaj = date('Y-m-d');
		$wczoraj = mktime (0,0,0,date("m")  ,date("d")-1,date("Y"));
		$wczoraj = date('Y-m-d', $wczoraj);
		$mktime = mktime (0,0,0,date("m")-1,01,  date("Y"));
		//echo 
		$poczatek_poprzedniego_miesiaca = date('Y-m-d', $mktime);
		$mktime += 1*24*3600;
		$dni_w_miesiacu = 1;
		while (date('d', $mktime) != '01'){
			$mktime += 1*24*3600;
			$dni_w_miesiacu++;
		}
		//echo 
		$poczatek_obecnego_miesiaca = date('Y-m-d', $mktime);
		
		switch($sekcja){
			case 'newsy' : {
				switch($czas){
					case 'ten_miesiac' : {
						// z tego miesiaca
						$sql = "SELECT * FROM newsy n INNER JOIN `newsy_kategorie` k ON n.id_news = k.id_news WHERE data > '$poczatek_obecnego_miesiaca' AND data < '$dzisiaj' ORDER BY klikniec DESC LIMIT $top;";
					} break;
					case 'poprzedni_miesiac' : {
						$sql = "SELECT * FROM newsy n INNER JOIN `newsy_kategorie` k ON n.id_news = k.id_news WHERE data > '$poczatek_poprzedniego_miesiaca' AND data < '$poczatek_obecnego_miesiaca' ORDER BY klikniec DESC LIMIT $top;";
					} break;
					case 'dzisiaj' : {
						$sql = "SELECT * FROM newsy n INNER JOIN `newsy_kategorie` k ON n.id_news = k.id_news WHERE data >= '$dzisiaj' ORDER BY klikniec DESC LIMIT $top;";
					} break;
					case 'wczoraj' : {
						$sql = "SELECT * FROM newsy n INNER JOIN `newsy_kategorie` k ON n.id_news = k.id_news WHERE data >= '$wczoraj' AND data <= '$dzisiaj' ORDER BY klikniec DESC LIMIT $top;";
					} break;
					case 'calosc' : {
						$sql = "SELECT * FROM newsy n ORDER BY klikniec DESC LIMIT $top;";
					} break;
				}
			} break;
			case 'serwisy' : {
				switch($czas){
					case 'ten_miesiac' : {
						if ($dziedzina == 'klikniecia') $sql = "SELECT id_serwis, SUM(n.klikniec) klikniecia FROM newsy n WHERE data > '$poczatek_obecnego_miesiaca' AND data < '$dzisiaj' GROUP BY id_serwis ORDER BY klikniecia DESC LIMIT $top;";
						else if ($dziedzina == 'liczba') $sql = "SELECT id_serwis, COUNT(n.id_news) newsow FROM newsy n WHERE data > '$poczatek_obecnego_miesiaca' AND data < '$dzisiaj' GROUP BY id_serwis ORDER BY newsow DESC LIMIT $top;";
					} break;
					case 'poprzedni_miesiac' : {
						if ($dziedzina == 'klikniecia') $sql = "SELECT id_serwis, SUM(n.klikniec) klikniecia FROM newsy n WHERE data > '$poczatek_poprzedniego_miesiaca' AND data < '$poczatek_obecnego_miesiaca' GROUP BY id_serwis ORDER BY klikniecia DESC LIMIT $top;";
						else if ($dziedzina == 'liczba') $sql = "SELECT id_serwis, COUNT(n.id_news) newsow FROM newsy n WHERE data > '$poczatek_poprzedniego_miesiaca' AND data < '$poczatek_obecnego_miesiaca' GROUP BY id_serwis ORDER BY newsow DESC LIMIT $top;";
					} break;
					case 'calosc' : {
						if ($dziedzina == 'klikniecia') $sql = "SELECT id_serwis, SUM(n.klikniec) klikniecia FROM newsy n GROUP BY id_serwis ORDER BY klikniecia DESC LIMIT $top;";
						else if ($dziedzina == 'liczba') $sql = "SELECT id_serwis, COUNT(n.id_news) newsow FROM newsy n GROUP BY id_serwis ORDER BY newsow DESC LIMIT $top;";
					} break;
				}
			} break;
			case 'kategorie' : {
				switch($czas){
					case 'ten_miesiac' : {
						if ($dziedzina == 'klikniecia') $sql = "SELECT id_kategoria, SUM(n.klikniec) klikniecia FROM newsy n INNER JOIN newsy_kategorie nk ON n.id_news = nk.id_news WHERE data > '$poczatek_obecnego_miesiaca' AND data < '$dzisiaj' GROUP BY id_kategoria ORDER BY klikniecia DESC LIMIT $top;";
						else if ($dziedzina == 'liczba') $sql = "SELECT id_kategoria, COUNT(n.id_news) newsow FROM newsy n INNER JOIN newsy_kategorie nk ON n.id_news = nk.id_news WHERE data > '$poczatek_obecnego_miesiaca' AND data < '$dzisiaj' GROUP BY id_kategoria ORDER BY newsow DESC LIMIT $top;";
					} break;
					case 'poprzedni_miesiac' : {
						if ($dziedzina == 'klikniecia') $sql = "SELECT id_kategoria, SUM(n.klikniec) klikniecia FROM newsy n INNER JOIN newsy_kategorie nk ON n.id_news = nk.id_news WHERE data > '$poczatek_poprzedniego_miesiaca' AND data < '$poczatek_obecnego_miesiaca' GROUP BY id_kategoria ORDER BY klikniecia DESC LIMIT $top;";
						else if ($dziedzina == 'liczba') $sql = "SELECT id_kategoria, COUNT(n.id_news) newsow FROM newsy n INNER JOIN newsy_kategorie nk ON n.id_news = nk.id_news WHERE data > '$poczatek_poprzedniego_miesiaca' AND data < '$poczatek_obecnego_miesiaca' GROUP BY id_kategoria ORDER BY newsow DESC LIMIT $top;";
					} break;
					case 'calosc' : {
						if ($dziedzina == 'klikniecia') $sql = "SELECT id_kategoria, SUM(n.klikniec) klikniecia FROM newsy n INNER JOIN newsy_kategorie nk ON n.id_news = nk.id_news GROUP BY id_kategoria ORDER BY klikniecia DESC LIMIT $top;";
						else if ($dziedzina == 'liczba') $sql = "SELECT id_kategoria, COUNT(n.id_news) newsow FROM newsy n INNER JOIN newsy_kategorie nk ON n.id_news = nk.id_news GROUP BY id_kategoria ORDER BY newsow DESC LIMIT $top;";
					} break;
				}
			} break;
			default : echo 'nie wybrano sekcji';
		}
		if ($sekcja != 'brak'){
			$wynik = $this->BD->Zapytanie($sql, true, true);
			return $wynik;
		}
	}
	
	public function Liczba($czego = 'newsow'){
		switch ($czego){
			case 'newsow' : {
				$sql = "SELECT COUNT(*) FROM `newsy`;";
			} break;
			case 'klikniec' : {
				$sql = "SELECT SUM(`klikniec`) FROM `serwisy`;";
			}
		}
		return $this->BD->ZapytanieOLiczbe($sql);
	}
	
	private function ZapiszLiczbeKlikniec(){
		$sql = "SELECT * FROM `licznik` ORDER BY `data` DESC LIMIT 1;";
		$dane = $this->BD->Zapytanie($sql, true, true);
		//var_dump($dane);
		$dane = $dane[0];
		
		if (date("Y-m-d") !=  $dane['data'] ){
			$sql = "INSERT INTO `licznik` (`data` ,`klikniec` ) VALUES  ('".date("Y-m-d")."', ".$this->Liczba('klikniec').");";
			$this->BD->Zapytanie($sql, false, true);
		}
	}
	
	public function StatKlikniecPokaz(){
		$this->ZapiszLiczbeKlikniec();
		$sql = "SELECT * FROM `licznik` ORDER BY `data` DESC LIMIT 2;";
		$dane = $this->BD->Zapytanie($sql, true, true);
		$wynik = $dane[0]['klikniec'] - $dane[1]['klikniec'];
		return $wynik;
	}
	
	public function Znajdz($co = '', $punkty = 3){
		$sql = "SELECT * , MATCH (tytul) AGAINST ('$co') AS score FROM `newsy` WHERE MATCH (tytul) AGAINST ('$co') HAVING score > $punkty ORDER BY score DESC LIMIT 100;";
		$wynik = $this->BD->Zapytanie($sql, true, true);
		/* DODANIE DO BAZY CO BY�O SZUKANE */
		/*
		if ($co != ''){
			$sql = "INSERT INTO `szukane` (id_szukanego, data, slowa) VALUES(NULL,'".date("Y-m-d")."' ,'$co');";
			$this->BD->Zapytanie($sql, false, true);
		}
		*/
		return $wynik;
	}
}

?>